/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation
**
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
**     the names of its contributors may be used to endorse or promote
**     products derived from this software without specific prior written
**     permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
** $QT_END_LICENSE$
**
****************************************************************************/
#include "indicatorinfoprivate.h"
#include "indicatorinfowrapper.h"

/*!
 * Default constructor
 */
IndicatorInfoPrivate::IndicatorInfoPrivate(IndicatorInfoWrapper *wrapper)
: CActive(CActive::EPriorityStandard), q_ptr(wrapper),
  iTelephony(NULL), iIndicatorV1Pckg(iIndicatorV1)
{
    CActiveScheduler::Add(this);
}

/*!
 * Retrives charging indicator information
 */
void IndicatorInfoPrivate::RequestIndicator()
{
    ASSERT(!IsActive());
    int err = CreateCTelephony();
    if ( err )
        {
        emit (q_ptr->errorOccured(err));        
        }
    else
        {
        // Retrieves the battery charging indicator, the network availability indicator and call-in-progress indicator.
        iTelephony->GetIndicator(iStatus, iIndicatorV1Pckg);
        SetActive();
        }
}

/*!
* CreateCTelephony
* Ensures that iTelephony instance exists before called.
* @return error code
*/
int IndicatorInfoPrivate::CreateCTelephony()
{
    int err = 0;
    if( !iTelephony )
        {
        TRAP(err, iTelephony = CTelephony::NewL());        
        }
    return err;
}

/*!
 * Executes in the response to the complete request -
 * fetching Indicator information.
 * Emits the Indicator info if successful otherwise errorcode
 */
void IndicatorInfoPrivate::RunL()
{
    if( iStatus == KErrNone ) {
        // Registers interest in receiving change notifications for events.
        iTelephony->NotifyChange(iStatus, CTelephony::EIndicatorChange, iIndicatorV1Pckg );
        if(iIndicatorV1.iCapabilities & CTelephony::KIndChargerConnected) {
            // We can detect when a charger is connected
            if(iIndicatorV1.iIndicator & CTelephony::KIndChargerConnected) {
                // Charger is connected
                emit (q_ptr->indicatorUpdated("Charger connected\n"));
                }
            else {
                // Charger is not connected
                emit (q_ptr->indicatorUpdated("Charger not connected\n"));
                 }
         }
         else {
         // We do not know whether a charger is connected.
         emit (q_ptr->indicatorUpdated("Status of charger unknown\n"));
         }

    } else {
        emit (q_ptr->errorOccured(iStatus.Int()));
    }
}

/*!
 * Cancels the request for Indicator
 */
void IndicatorInfoPrivate::DoCancel()
{
    // Cancels an outstanding asynchronous request.
    iTelephony->CancelAsync(CTelephony::EIndicatorChangeCancel);
}
